import standardNormalTable from "./standard_normal_table.js";

/**
 * **[累积标准正态概率](http://en.wikipedia.org/wiki/Standard_normal_table)**
 *
 * 由于无法为每个正态分布打印概率表（因为正态分布有无限多种），通常的做法是将正态分布转换为标准正态分布，
 * 然后使用标准正态分布表查找概率。
 *
 * 你可以使用 `.5 + .5 * errorFunction(x / Math.sqrt(2))` 来计算概率，
 * 而不是从表格中查找。
 *
 * @param {number} z 标准正态分布的z值
 * @returns {number} 累积标准正态概率
 */
function cumulativeStdNormalProbability(z) {
    // 计算该值的位置。
    const absZ = Math.abs(z);
    // 每一行以不同的有效数字开头：0.5、0.6、0.7等。表格中的每个值
    // 对应输入值范围为0.01，因此该值乘以100。
    const index = Math.min(
        Math.round(absZ * 100),
        standardNormalTable.length - 1
    );

    // 我们计算的索引必须在表格中为正值，
    // 但我们仍然关注输入值是正还是负，并在最后一步翻转输出值。
    if (z >= 0) {
        return standardNormalTable[index];
    } else {
        // 由于浮点数运算，表格中具有4位有效数字的值在计算时可能会变成循环小数。
        return Math.round((1 - standardNormalTable[index]) * 1e4) / 1e4;
    }
}

export default cumulativeStdNormalProbability;
